/**
 * 版权所有(C)，上海勾芒信息科技，2016，所有权利保留。
 * 
 * 项目名：	carwx
 * 文件名：	AutoRespMsgReplyTool.java
 * 模块说明：	
 * 修改历史：
 * 2016年12月4日 - Debenson - 创建。
 */
package com.alex.wechat.mp.handler;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alex.wechat.mp.config.WxConsts;
import com.alex.wechat.mp.config.WxContext;
import com.alex.wechat.mp.extension.Extension;
import com.alex.wechat.mp.extension.ExtensionRegistory;
import com.alex.wechat.mp.message.autoresp.entity.WxAutoResponse;
import com.alex.wechat.mp.message.autoresp.service.WxAutoResponseServiceI;
import com.gomore.jeecg.common.Assert;

import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;

/**
 * 自动回复助手。
 * 
 * @author Debenson
 * @since 0.1
 */
@Component
public class AutoReplyTool {

  @Autowired
  private TemplateMsgReplyTool msgReplyTool;
  @Autowired
  private WxAutoResponseServiceI autoRespService;

  public WxMpXmlOutMessage autoReply(WxMpXmlMessage msg, String key) {
    WxMpXmlOutMessage m = null;
    WxAutoResponse resp = findByKey(key);
    if (resp != null) {
      String msgType = resp.getMsgType();
      if (WxConsts.XML_MSG_TEXT.equals(msgType)) {
        m = msgReplyTool.replyTextMsg(msg, resp.getTemplateId());
      } else if (WxConsts.XML_MSG_NEWS.equals(msgType)) {
        m = msgReplyTool.replyNewsMsg(msg, resp.getTemplateId());
      }
    }
    if (m == null) {
      m = replyKeyExtensions(msg);
    }
    return m;
  }

  private WxMpXmlOutMessage replyKeyExtensions(WxMpXmlMessage msg) {
    final String content = msg.getContent();
    for (Extension ext : ExtensionRegistory.getExtensions()) {
      if (ext.keys().contains(content)) {
        return ext.execute(msg);
      }
    }
    return null;
  }

  /**
   * 遍历关键字管理中是否存在用户输入的关键字信息
   * 
   * @param keyword
   * @return
   */
  private WxAutoResponse findByKey(String keyword) {
    Assert.assertArgumentNotEmpty(keyword, "keyword");

    String hql = "from " + WxAutoResponse.class.getName() + " where accountId = ? and keyWord = ?";
    List<WxAutoResponse> autoResponses = autoRespService.findByHql(hql, WxContext.getOriginalId(),
        keyword);
    return autoResponses.isEmpty() ? null : autoResponses.get(0);
  }

}
